/*
 * app_log.h
 *
 *  Created on: 2023年6月29日
 *      Author: HXF
 *      Author: FJX
 */

#ifndef APP_LOG_H_
#define APP_LOG_H_

#include "stdio.h"
#include "string.h"
#include "bsp_usart.h"

#define APP_LOG_LEVEL_ERROR                0
#define APP_LOG_LEVEL_INFO                 1
#define APP_LOG_LEVEL_DEBUG                2

#define APP_LOG_ENABLE                  1
#define APP_LOG_LEVEL_FILTER_ENABLE     1

#define APP_LOG_LEVEL_FILTER_THRESHOLD  APP_LOG_LEVEL_ERROR


#ifdef __cplusplus
extern "C" {
#endif


#define APP_PRINTF  printf //debug_printf
#define APP_PRINTF_HEX(str,buff,size) \
  do{\
      APP_PRINTF("%s",(char*)str);\
      debug_printf_hex(buff,size);\
}while(0)


bool _app_log_check_level(uint8_t level);
void _app_log_time(void);

#if(APP_LOG_ENABLE == 1)

#define _app_log_print_prefix(lev)                   \
  do {                                               \
    switch (lev) {                                   \
      case APP_LOG_LEVEL_DEBUG:                      \
        APP_PRINTF("[DEBUG] ");                      \
        break;                                       \
      case APP_LOG_LEVEL_INFO:                       \
        APP_PRINTF("[INFO] ");                       \
        break;                                       \
      case APP_LOG_LEVEL_ERROR:                      \
        APP_PRINTF("[ERROR] ");                      \
        break;                                       \
      default:                                       \
        break;                                       \
    }                                                \
  } while (0)


#define FILE_NAME(x) strrchr(x,'/')?strrchr(x,'/')+1:x


#if 1

#define _app_log_print_trace()             \
    do {                                   \
        APP_PRINTF("[%s:%d][%s] ",         \
                     FILE_NAME(__FILE__),  \
                     __LINE__,             \
                     __func__);            \
    }while (0)                             \

#else
#define _app_log_print_trace()
#endif

#define DS_app_log_level(level, ...)    \
  do {                                  \
      if(_app_log_check_level(level)) { \
          _app_log_time();              \
          /*_app_log_print_prefix(level);*/ \
          /*_app_log_print_trace();*/       \
          APP_PRINTF(__VA_ARGS__);      \
      }                                 \
  }while(0)                             \

#else
#define DS_app_log_level(level, ...)
#endif

#if (APP_LOG_LEVEL_FILTER_THRESHOLD >= APP_LOG_LEVEL_DEBUG)
#define DS_app_log_debug(...)             \
    DS_app_log_level(APP_LOG_LEVEL_DEBUG, \
                __VA_ARGS__)
#else
#define DS_app_log_debug(...)
#endif


#if (APP_LOG_LEVEL_FILTER_THRESHOLD >= APP_LOG_LEVEL_INFO)
#define DS_app_log_info(...)              \
    DS_app_log_level(APP_LOG_LEVEL_INFO,  \
                __VA_ARGS__)
#else
#define DS_app_log_info(...)
#endif


#define DS_app_log_error(...)              \
    DS_app_log_level(APP_LOG_LEVEL_ERROR,  \
                __VA_ARGS__)


void DS_app_log_hexdump(uint8_t level,char *text,uint8_t *buf,uint32_t len);

#define _app_log_hexdump(level,text,buf,len)  \
    if(_app_log_check_level(level)) {           \
          _app_log_time();              \
          /*_app_log_print_prefix(level);*/ \
          /*_app_log_print_trace();*/       \
    DS_app_log_hexdump(level,text,buf,len); }

#if (APP_LOG_LEVEL_FILTER_THRESHOLD >= APP_LOG_LEVEL_INFO)
#define DS_app_log_hexdump_info(text,buf,len) \
    _app_log_hexdump(APP_LOG_LEVEL_INFO,text,buf,len)
#else
#define DS_app_log_hexdump_info(text,buf,len)
#endif

#if (APP_LOG_LEVEL_FILTER_THRESHOLD >= APP_LOG_LEVEL_DEBUG)
#define DS_app_log_hexdump_debug(text,buf,len) \
    _app_log_hexdump(APP_LOG_LEVEL_DEBUG,text,buf,len)
#else
#define DS_app_log_hexdump_debug(text,buf,len)
#endif

#define DS_app_log_hexdump_error(text,buf,len) \
    _app_log_hexdump(APP_LOG_LEVEL_ERROR,text,buf,len)

void DS_app_func_tm_in(void);
void DS_app_func_tm_end(char *func);

#ifdef __cplusplus
}
#endif

#endif /* APP_LOG_H_ */
